//////////////////////////////////////////////
/// CALCULADORA PARA CEGOS
/// 
/// Gestão de Projecto de Software 2013-2014
///
/// Grupo 14:
/// Diogo Moita - 21170937
/// Diogo Oliveira - 21180842
/// Luís Monteiro - 21170270
/// Luís Costa - 21210392
/// Nuno Aguiar - 21160515
/// Pedro Marques - 21160524
//////////////////////////////////////////////
package cvi;

import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Calcular {

    private double valor1;
    private double valor2;
    private char op;

    // Construtor para operaçoes apenas com um numero
    Calcular(double valor1, char op) {
        this.valor1 = valor1;
        this.op = op;
    }

    // Construtor para operaçoes com dois numeros
    Calcular(double valor1, char op, double valor2) {
        this.valor1 = valor1;
        this.valor2 = valor2;
        this.op = op;
    }

    // Calcula o resultado da operação
    // Devolve: o resultado da operação numa variavel do tipo double.
    public double resultado() {
        double resultado = 0;
        switch (this.op) {
            case '+':
                resultado = valor1 + valor2;
                break;
            case '-':
                resultado = valor1 - valor2;
                break;
            case '*':
                resultado = valor1 * valor2;
                break;
            case '/':
                if (valor2 == 0) { // não é possivel dividir por zero
                    return 999999999; // provocar erro
                } else {
                    resultado = valor1 / valor2;
                }
            case 'R': // Raiz quadrada
                if (valor1 < 0) { // raiz quadrada não pode ter valores negativos
                    return 999999999; // provocar erro
                } else {
                    resultado = Math.sqrt(valor1);
                }
                break;
            case 'Q': // Quadrado
                resultado = valor1 * valor1;
                break;
            case '%':
                resultado = valor1 * 100;
                break;
        }
        
        System.out.print("Calcular: ");
        System.out.print(valor1);
        System.out.print(op);
        System.out.print(valor2);
        System.out.print("=");
        System.out.println(resultado);

        // O resultado tem um numero com mais de 8 digitos
        if (resultado > 99999999 || resultado < -99999999) {
            return 999999999; // provocar erro
        }

        // Converter e arredondar resultado para não ter digitos a mais na parte decimal.
        DecimalFormat df = new DecimalFormat("#.#######");
        String[] r_dividido = df.format(resultado).split(","); // dividir valor pelo virgula

        if (r_dividido.length == 2 && r_dividido[0].length() < 8) { // Tem parte decimal e há espaço para a apresentar
            df.setMaximumFractionDigits(8 - r_dividido[0].length());
            df.setRoundingMode(RoundingMode.HALF_UP);
            String resl_temp = df.format(resultado).replace(',', '.');
            resultado = Double.parseDouble(resl_temp);
        } else {
            resultado = Double.parseDouble(r_dividido[0]);
        }
        return resultado;
    }

    public double getValor1() {
        return valor1;
    }

    public double getValor2() {
        return valor2;
    }

    public char getOp() {
        return op;
    }

    public void setValor1(double valor1) {
        this.valor1 = valor1;
    }

    public void setValor2(double valor2) {
        this.valor2 = valor2;
    }

    public void setOp(char op) {
        this.op = op;
    }
}
